package com.ds.admin.controller;

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;

import com.ds.common.web.response.Result;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Enumeration;

/**
 * SaController
 */
@RestController
@RequestMapping("/user")
public class SaController {

	// 测试登录，浏览器访问： http://localhost:8081/user/doLogin?username=zhang&password=123456
	@GetMapping("/login")
	public Object doLogin(@RequestParam String username, @RequestParam String password, HttpServletRequest request) {
		// 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对
		if ("zhang".equals(username) && "123456".equals(password)) {
			StpUtil.login(10001);
			SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
			return tokenInfo;
		}
		return "登录失败";
	}

	// 查询登录状态，浏览器访问： http://localhost:8081/user/isLogin
	@GetMapping("/isLogin")
	public String isLogin() {
		return "当前会话是否登录：" + StpUtil.isLogin();
	}

	// 查询 Token 信息 ---- http://localhost:8081/acc/tokenInfo
	@GetMapping("/tokenInfo")
	public SaResult tokenInfo() {
		return SaResult.data(StpUtil.getTokenInfo());
	}

	// 测试注销 ---- http://localhost:8081/acc/logout
	@GetMapping("/logout")
	public SaResult logout() {
		StpUtil.logout();
		return SaResult.ok();
	}

	@GetMapping("/permissionList")
	public Result<Object> permissionList() {
		// 判断：当前账号是否含有指定权限, 返回 true 或 false
		StpUtil.hasPermission("user.add");
		// 校验：当前账号是否含有指定权限, 如果验证未通过，则抛出异常: NotPermissionException
		StpUtil.checkPermission("user.add");
		// 校验：当前账号是否含有指定权限 [指定多个，必须全部验证通过]
		StpUtil.checkPermissionAnd("user.add", "user.delete", "user.get");
		// 校验：当前账号是否含有指定权限 [指定多个，只要其一验证通过即可]
		StpUtil.checkPermissionOr("user.add", "user.delete", "user.get");

		// 获取：当前账号所拥有的权限集合
		return Result.success(StpUtil.getPermissionList());
	}

}
